package cn.iocoder.yudao.module.api.promotion.groupon;

import cn.iocoder.yudao.framework.business.basic.pojo.dto.LocationQueryDTO;
import cn.iocoder.yudao.framework.business.basic.pojo.dto.SortQueryDTO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.api.promotion.groupon.dto.GrouponPackageRespDTO;
import jakarta.annotation.Nullable;

import java.util.*;

/**
 * <pre>
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 *  这里是文件说明
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 * </pre>
 *
 * @author 山野羡民（1032694760@qq.com）
 * @since 2025/01/18
 */
public interface GrouponPackageApi {

    /**
     * 根据团购套餐编号，获得团购套餐
     *
     * @param id 团购套餐编号
     * @return 团购套餐
     */
    GrouponPackageRespDTO getDetail(Long id);

    /**
     * 根据套餐编号集合，获得团购套餐列表
     * @param ids 套餐编号集合
     * @return 团购套餐列表
     */
    Map<Long, GrouponPackageRespDTO> getMap(Collection<Long> ids);

    /**
     * 根据店铺编号集合，获得团购套餐列表
     * @param shopIds 店铺编号集合
     * @return 团购套餐列表
     */
    Map<Long, List<GrouponPackageRespDTO>> getMapByShopIds(Collection<Long> shopIds);

    /**
     * 根据经纬度获得有团购套餐得店铺编号及距离
     *
     * @param location 经纬度
     * @param sort 排序
     * @return 店铺编号集合
     */
    Map<Long, Integer> getShopDistanceMap(@Nullable LocationQueryDTO location, @Nullable SortQueryDTO sort);

    /**
     * 根据店铺编号集合，获得团购套餐编号
     *
     * @param shopIds 店铺编号集合
     * @return 团购套餐列表
     */
    Map<Long, Long> getShopPackageMap(Collection<Long> shopIds);

    /**
     * 根据经纬度获得有团购套餐得店铺编号
     *
     * @param sort 排序
     * @return 店铺编号集合
     */
    default Set<Long> getShopIds(@Nullable SortQueryDTO sort) {
        Map<Long, Integer> map = getShopDistanceMap(null, sort);
        if (map == null) {
            return new HashSet<>();
        }
        return new HashSet<>(map.keySet());
    }

    PageResult<GrouponPackageRespDTO> getPage(Integer pageNo, Integer pageSize, Set<Long> shopIds);

}
